//
//  ILBleObject.h
//  IMILabKit
//
//  Created by Roffa Zhou on 2022/4/2.
//

#import <Foundation/Foundation.h>
#import "ILBleUtil.h"
#if defined(__has_include) && __has_include(<IMILabSDK_BindCommon/IMILabSDK_BindCommon.h>)
#import <IMILabSDK_BindCommon/ILBindDefine.h>

#else
#import "ILBindDefine.h"

#endif

NS_ASSUME_NONNULL_BEGIN

@interface ILBleObject : NSObject
@property(nonatomic)BOOL bDisableCallback;          //是否禁用所有callback响应，默认为NO, 当设置为YES时，下面所有block如果设置了值，不会进行响应。用于处理多个ILBleObject对象持有同一个蓝牙外设的场景  rf/2022-07-22
@property(nonatomic)BOOL isDisableNext;//是否禁用自动发送下一步消息 默认为NO，设置为YES时，RN层调用消息不自动进行下一步操作
@property(nonatomic, strong, readonly) ILBlePeripheral *peripheral;
@property(nonatomic, copy)IL_Bind_Discovery_Block _Nullable discoveryBlock; /// 发现设备回调
@property(nonatomic, copy)IL_Bind_Ble_Mac_Block _Nullable getMacBlock;           /// 获取设备mac回调
@property(nonatomic, copy)IL_Bind_Ble_Device_Block _Nullable connectBlock;       /// 已连接设备回调
@property(nonatomic, copy)IL_Bind_Ble_Device_Block _Nullable disconnectBlock;    /// 断开连接设备回调
@property(nonatomic, copy)IL_Bind_Ble_Device_Service_Block _Nullable serviceBlock;       /// 已发现服务回调
@property(nonatomic, copy)IL_Bind_Ble_Device_Characteristic_Block _Nullable characteristicBlock;    /// 已发现特征回调
@property(nonatomic, copy)IL_Bind_Ble_Device_Default_Block _Nullable notifyBlock;        //已监听蓝牙回调， 此时可以向蓝牙设备发送后续交互数据
@property(nonatomic, copy)IL_Bind_Ble_Device_Data_Block _Nullable receiveBlock;       /// 接收蓝牙数据回调
@property(nonatomic, copy)IL_Bind_Error_Block _Nullable bindErrorBlock;      //绑定错误回调
@property(nonatomic, copy)IL_Bind_Mode_Block _Nullable bindStateBlock;
@property(nonatomic, copy)IL_Bind_Ble_Device_Descriptor_Block _Nullable writeDescriptorBlock;    /// 写入descriptor回调
@property(nonatomic, copy)IL_Bind_Ble_Device_Default_Block _Nullable scanDescriptorBlock;    /// 扫描descriptor回调
@property(nonatomic, copy)IL_Bind_Ble_Device_Descriptor_Block _Nullable updateDescriptorBlock;    /// 扫描descriptor回调
@property(nonatomic, copy)IL_Bind_Ble_Device_Default_Block _Nullable writeValueBlock;   ///写入数据是否成功回调
/**
 蓝牙设备状态
 0,状态未知，更新迫在眉睫。
 1,与系统服务的连接暂时丢失，即将更新。
 2,该平台不支持蓝牙低能耗中央/客户端角色。
 3,应用程序未被授权使用蓝牙低能耗中央/客户端角色。
 4,蓝牙目前处于关闭状态
 5,蓝牙目前处于开机状态，可以使用。
 */
@property(nonatomic, copy)IL_Bind_Ble_State_Block bleStateBlock;


//mode_1蓝牙绑定时，第一步获取到密钥回调，用户应该在回调里面完成后续的绑定操作，完成后调用wakeUpBleRegister:回传结果
@property(nonatomic, copy)IL_Ble_Mode1_Succ_Block secretBlock;
//mode_2方式绑定蓝牙时，蓝牙通讯绑定完成回调，此时已经获取到绑定需要的token值，用户应该在回调里完成后续的wifit绑定操作，上报给服务器，完成操作后，绑定流程结束
@property(nonatomic, copy)IL_Ble_Mode2_Succ_Block mode2Block;

@property(nonatomic, strong)ILBindErrorModel *bindError;     //绑定错误类型
@property(nonatomic, strong)ILBindModeModel *bindMode;     //当前绑定状态


/// 获取蓝牙状态
- (ILCBManagerState)cbManagerState;
/// 开始扫描蓝牙设备,
/// @param timeout 超时时间 秒
- (void)startScan:(short)timeout ;
/// 停止扫描
- (void)stopScan;

/// 绑定设备
/// @param device 设备对象
- (void)connectDevice:(ILBlePeripheral*)device;
/// 断开连接
- (void)disconnect;

/// 发送蓝牙数据
/// @param data 需要发送的数据
/// @author rf/2022-03-29
- (void)sendBleMsg:(NSData*)data ;
/// 发送加密的蓝牙数据
/// @param data 需要发送的数据。不传使用内部加密key, 无特殊使用场景都无需传入key
/// @author rf/2022-03-29
- (void)sendEncryptBleMsg:(NSData*)data encryptKey:(NSData* __nullable)key ;


/// 使用IL_Ble_Mode1_Succ_Block处理完绑定逻辑后，需要调用此方法告知设备端，整个绑定流程已完毕
/// @param isSucc  绑定接口如成功，传入true, 否则传false
/// @note 绑定组件内部有自动完成整个调用流程
- (void)wakeUpBleRegister:(BOOL)isSucc;
@end

NS_ASSUME_NONNULL_END
